package main

import (
	"fmt"
)

func main() {
	// basic()
	// newStr()

	shareStringArray()
}

func basic() { // 初始化了两个容量，访问第3个会越界
	ints := make([]int, 2, 5)
	fmt.Println(ints[3])
}

func newStr() {
	// new返回值是切片开始地址，但此时并未对切片分配内存，不能直接使用
	ps := new([]string)
	// (*ps)[0] = "eggo" // 并未分配地址，不能使用，运行时会报错 panic: runtime error: index out of range [0] with length 0
	fmt.Printf("addr:%p \n", ps)
	// append 为ps分配了空间
	*ps = append(*ps, "eggo")

	fmt.Printf("addr:%p \n", ps)
	fmt.Println(ps)  //point，&[eggo]
	fmt.Println(*ps) // 解引用，[eggo]
}

func shareStringArray() {
	arr := []int{0, 1, 2, 3, 4}
	fmt.Printf("arr扩容前: addr:%p \n", arr)
	fmt.Printf("arr: addr:%p ,value:%v ,len:%d, cap:%d \n", arr, arr, len(arr), cap(arr))
	arr1 := arr[1:3]
	fmt.Printf("arr1: addr:%p ,value:%v ,len:%d, cap:%d \n", arr1, arr1, len(arr1), cap(arr1))
	arr2 := arr[4:]
	arr2[0] = 5
	// note1: 共享同一个底层数组，新截取的切片对底层数据修改会直接影响原始切片
	fmt.Printf("value: arr:%v,arr2:%v\n", arr, arr2)
	fmt.Printf("arr2: addr:%p ,value:%v ,len:%d, cap:%d \n", arr2, arr2, len(arr2), cap(arr2))

	// note2:新切片若扩容，则会重新分配一段内存，然后将原始数据拷贝过来，
	arr2 = append(arr2, 8, 9, 10)
	fmt.Printf("arr扩容后: addr:%p \n", arr)

	// note3:扩容后是新分配内存并没有共享以前的数组，对新切片修改不会影响原始切片
	arr2[0] = 6
	fmt.Printf("arr: addr:%p ,value:%v ,len:%d, cap:%d \n", arr, arr, len(arr), cap(arr))
	fmt.Printf("arr2: addr:%p ,value:%v ,len:%d, cap:%d \n", arr2, arr2, len(arr2), cap(arr2))
}
